package com.dha.dao.impl;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.JAXBException;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.dha.custom.ThongBaoCustom;
import com.dha.dao.ThongBaoDAO;
import com.dha.entities.ThongBaoEntity;

@WebService(targetNamespace = "ThongBaoService")
public class ThongBaoDAOImpl implements ThongBaoDAO {
	private SessionFactory sessionFactory = new Configuration().configure()
			.buildSessionFactory();
	private Session session;
	private SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
			"yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.JAPAN);

	// private SimpleDateFormat simpleDateFormat = new
	// SimpleDateFormat("HH:mm - dd-MM-yyyy");
	// Phương thức xem chỉ số max của tin thông báo
	// để dựa vào đây, bỏ vào between sql trong phương thức xem thông báo
	public int idThongBaoCuoiCung() {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			String sql = "select max(maThongBao) from ThongBaoEntity";

			Query query = session.createQuery(sql);

			int ketQua = (int) query.list().get(0);
			session.getTransaction().commit();
			return ketQua;
		} catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
			return -1;
		} finally {
			session.close();
		}
	}

	// Phương thức xem thông báo từ thông báo cuối cùng - 20 đến thông báo cuối
	// cùng
	@Override
	@WebMethod(operationName = "XemThongBao")
	public List<ThongBaoCustom> xemThongBao() {
		try {
			int idThongBaoCuoi = this.idThongBaoCuoiCung();
			session = sessionFactory.openSession();
			session.beginTransaction();

			String sql = "select new com.dha.custom.ThongBaoCustom(tb.maThongBao, tb.tieuDe, tb.noiDung, gv.tenGiaoVien, tb.ngayDang) "
					+ "from ThongBaoEntity tb, GiaoVienEntity gv "
					+ "where gv.maGiaoVien = tb.maGiaoVien "
					+ "and tb.maThongBao between ? and ?"
					// Sắp xếp theo mã thông báo giảm dần
					+ "order by tb.maThongBao desc";

			Query query = session.createQuery(sql);
			// set giá trị vào between, cách 20 thông báo
			query.setInteger(0, idThongBaoCuoi - 20);
			query.setInteger(1, idThongBaoCuoi);

			session.getTransaction().commit();
			return query.list();
		} catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
			return null;
		} finally {
			session.close();
		}
	}

	@Override
	@WebMethod(operationName = "XemThongBaoTheoGiaoVien")
	public List<ThongBaoCustom> xemThongBaoTheoGiaoVien(
			@WebParam(name = "MaGiaoVien") String maGiaoVien) {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			String sql = "select new com.dha.custom.ThongBaoCustom(tb.maThongBao, tb.tieuDe, tb.noiDung, gv.tenGiaoVien, tb.ngayDang) "
					+ "from ThongBaoEntity tb, GiaoVienEntity gv "
					+ "where gv.maGiaoVien = tb.maGiaoVien "
					+ "and tb.maGiaoVien = ? "
					// Sắp xếp theo mã thông báo giảm dần
					+ "order by tb.maThongBao desc";

			Query query = session.createQuery(sql);
			query.setParameter(0, maGiaoVien);
			// Lấy ra 20 thông báo của giáo viên
			query.setMaxResults(20);
			session.getTransaction().commit();
			return query.list();
		} catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
			return null;
		} finally {
			session.close();
		}
	}

	// Muc dich la co ma thong bao tu ben xem theo ngay, bo qua day chay
	@WebMethod(operationName = "XemThongBaoTheoMaThongBao")
	@Override
	public List<ThongBaoCustom> xemThongBaoTheoMaThongBao(
			@WebParam(name = "MaThongBao") String maThongBao) {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();
			// Date ngayVao = simpleDateFormat.parse(ngay);
			// String ngayRa = simpleDateFormat.format(ngayVao);
			String sql = "select new com.dha.custom.ThongBaoCustom(tb.maThongBao, tb.tieuDe, tb.noiDung, gv.tenGiaoVien, tb.ngayDang) "
					+ "from ThongBaoEntity tb, GiaoVienEntity gv "
					+ "where gv.maGiaoVien = tb.maGiaoVien "
					+ "and tb.maThongBao = '" + maThongBao + "'"
					// Sắp xếp theo mã thông báo giảm dần
					+ "order by tb.maThongBao desc";

			/*
			 * String sql =
			 * "select new com.dha.custom.ThongBaoCustom(tb.tieuDe, tb.noiDung, gv.tenGiaoVien, tb.ngayDang) "
			 * + "from ThongBaoEntity tb, GiaoVienEntity gv " +
			 * "where gv.maGiaoVien = tb.maGiaoVien " +
			 * "and LEFT(CONVERT(varchar,tb.ngayDang,120),10) = '"+ngay+"'"
			 * //Sắp xếp theo mã thông báo giảm dần +
			 * "order by tb.maThongBao desc";
			 */

			Query query = session.createQuery(sql);
			// query.setParameter(0, maThongBao);

			session.getTransaction().commit();
			return query.list();
		} catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
			return null;
		} finally {
			session.close();
		}
	}

	@WebMethod(operationName = "GoiThongBao")
	@Override
	public boolean themThongBao(
			@WebParam(name = "MaGiaoVien") String maGiaoVien,
			@WebParam(name = "TieuDe") String tieuDe,
			@WebParam(name = "NoiDung") String noiDung) {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			ThongBaoEntity tb = new ThongBaoEntity();
			tb.setMaGiaoVien(maGiaoVien);
			tb.setTieuDe(tieuDe);
			tb.setNoiDung(noiDung);
			// lấy ngày tháng hiện tại
			tb.setNgayDang(new Date());
			// tb.setNgayDang(simpleDateFormat.parse(ngayDang));

			session.save(tb);
			session.getTransaction().commit();

			return true;
		} catch (Exception e) {
			session.getTransaction().rollback();
			return false;
		} finally {
			session.close();
		}
	}

	// Tra ve danh sach ma cac thong bao ok
	/*
	@Override
	@WebMethod(operationName = "LayMaThongBaoTheoNgay")
	public List<String> layMaThongBaoTheoNgay(
			@WebParam(name = "Ngay") String ngay)
			throws javax.xml.bind.JAXBException {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			String sql = "select tb.maThongBao from thongBao tb where LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ?";

			Query query = session.createSQLQuery(sql);
			query.setParameter(0, ngay);
			List<String> ketQua = query.list();
			session.getTransaction().commit();
			return ketQua;
		} catch (Exception e) {
			session.getTransaction().rollback();
			// TODO: handle exception
			return null;
		} finally {
			session.close();
		}
	}

	@Override
	@WebMethod(operationName = "LayMaThongBaoTheoNgayVaGiaoVien")
	public List<String> layMaThongBaoTheoNgayMaVaGiaoVien(
			@WebParam(name = "MaGiaoVien") String maGiaoVien,
			@WebParam(name = "Ngay") String ngay) throws JAXBException {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			String sql = "select tb.maThongBao from thongBao tb where "
					+ "LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ? "
					+ "and tb.maGiaoVien = ?";
			Query query = session.createSQLQuery(sql);
			query.setParameter(0, ngay);
			query.setParameter(1, maGiaoVien);
			List<String> ketQua = query.list();
			session.getTransaction().commit();
			return ketQua;
		} catch (Exception e) {
			session.getTransaction().rollback();
			// TODO: handle exception
			return null;
		} finally {
			session.close();
		}
	}
*/
	@Override
	@WebMethod(operationName = "XemThongBaoTheoNgay")
	public ArrayList<ThongBaoCustom> layThongBaoTheoNgay(
			@WebParam(name = "Ngay") String ngay)
			throws javax.xml.bind.JAXBException {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();
			// Dung cho entity
			// String sql =
			// "select * from thongBao tb where LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ? order by tb.maThongBao desc";

			// SQLQuery query = (SQLQuery)
			// session.createSQLQuery(sql).addEntity(ThongBaoEntity.class).setParameter(0,
			// ngay);

			String sql = "select gv.tenGiaoVien, tb.tieuDe, tb.noiDung, tb.ngayDang, tb.maThongBao "
					+ "from thongBao tb, giaoVien gv  "
					+ "where tb.maGiaoVien = gv.maGiaoVien "
					+ "and LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ? "
					+ "order by tb.ngayDang desc";
			SQLQuery query = (SQLQuery) session.createSQLQuery(sql)
					.setParameter(0, ngay);

			List<Object> ketQua = query.list();
			ArrayList<ThongBaoCustom> arrayList = new ArrayList<ThongBaoCustom>();

			Iterator iterator = ketQua.iterator();

			while (iterator.hasNext()) {
				Object[] dong = (Object[]) iterator.next();
				String tenGiaoVien = (String) dong[0];
				String tieuDe = (String) dong[1];
				String noiDung = (String) dong[2];
				Timestamp ngayDang = (Timestamp) dong[3];
				int maThongBao = (int) dong[4];

				ThongBaoCustom tb = new ThongBaoCustom(maThongBao,tieuDe, noiDung,
						tenGiaoVien, ngayDang);
				arrayList.add(tb);

			}

			// Dung cho entity thi khong co ten giao vien, chi map voi entity
			//
			// while(iterator.hasNext()){
			// ThongBaoEntity tb = (ThongBaoEntity) iterator.next();
			// arrayList.add(tb);
			// }

			return arrayList;
		} catch (Exception e) {
			System.out.println(e.toString());
			session.getTransaction().rollback();
			return null;
		} finally {
			session.close();
		}

	}

	@Override
	@WebMethod(operationName = "XemThongBaoTheoNgayVaGiaoVien")
	public ArrayList<ThongBaoCustom> layThongBaoTheoNgayVaGiaoVien(
			@WebParam(name = "Ngay") String ngay,
			@WebParam(name = "MaGiaoVien") String maGiaoVien)
			throws JAXBException {
		try {
			session = sessionFactory.openSession();
			session.beginTransaction();

			// String sql =
			// "select * from thongBao tb where LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ? and tb.maGiaoVien = ? order by tb.maThongBao desc";

			// SQLQuery query = (SQLQuery) session.createSQLQuery(sql)
			// .addEntity(ThongBaoEntity.class).setParameter(0, ngay)
			// .setParameter(1, maGiaoVien);
			String sql = "select gv.tenGiaoVien, tb.tieuDe, tb.noiDung, tb.ngayDang, tb.maThongBao "
					+ "from thongBao tb, giaoVien gv  "
					+ "where tb.maGiaoVien = gv.maGiaoVien "
					+ "and LEFT(CONVERT(varchar,tb.ngayDang,120),10) = ? "
					+ "and tb.maGiaoVien = ? "
					+ "order by tb.ngayDang desc";
			SQLQuery query = (SQLQuery) session.createSQLQuery(sql)
					.setParameter(0, ngay).setParameter(1, maGiaoVien);

			List<Object> ketQua = query.list();
			ArrayList<ThongBaoCustom> arrayList = new ArrayList<ThongBaoCustom>();

			Iterator iterator = ketQua.iterator();

			while (iterator.hasNext()) {
				Object[] dong = (Object[]) iterator.next();
				String tenGiaoVien = (String) dong[0];
				String tieuDe = (String) dong[1];
				String noiDung = (String) dong[2];
				Timestamp ngayDang = (Timestamp) dong[3];
				int maThongBao = (int) dong[4];

				ThongBaoCustom tb = new ThongBaoCustom(maThongBao,tieuDe, noiDung,
						tenGiaoVien, ngayDang);
				arrayList.add(tb);

			}

			// while (iterator.hasNext()) {
			// ThongBaoEntity tb = (ThongBaoEntity) iterator.next();
			// arrayList.add(tb);
			// }

			return arrayList;
		} catch (Exception e) {
			System.out.println(e.toString());
			session.getTransaction().rollback();
			return null;
		} finally {
			session.close();
		}
	}

}
